<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>BlockInput</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="../css/default.css" rel="stylesheet" type="text/css">
</head>
<body>

<h1>BlockInput</h1>

<p>禁用或启用用户通过键盘和鼠标与计算机交互的能力.</p>

<pre class="Syntax">BlockInput, Mode </pre>
<h3>参数</h3>
<table class="info">
  <tr> 
    <td width="15%">Mode</td>
    <td width="85%"><p><strong><u>模式 1</u></strong>: 下列单词之一:</p>
      <p><strong>On</strong>: 阻止用户与计算机交互 (鼠标和键盘输入都无效).</p>
      <p><strong>Off</strong>: 重新启用输入.</p>
      <p><strong><u>模式 2</u></strong> (在 Windows 9x 上无效): 此模式的操作独立于其他两种. 例如, <em>BlockInput On</em> 会继续阻塞输入直到使用了 <em>BlockInput Off</em>, 即使在下面某个单词仍然有效的情况下.</p>
      <p><strong>Send</strong>: 正在执行 <a href="Send.htm">Send</a> 或 <a href="Send.htm">SendRaw</a> 命令 (仅对于传统的 <a href="SendMode.htm">SendEvent 模式</a>) 时, 用户的键盘和鼠标输入被忽略. 这样避免了用户的键击扰乱模拟键击流. 当 Send 结束时, 会重新启用输入 (如果之前没有使用 <em>BlockInput On</em> 阻塞的情况下).</p>
      <p><strong>Mouse</strong>: 正在执行 <a href="Click.htm">Click</a>, <a href="MouseMove.htm">MouseMove</a>, <a href="MouseClick.htm">MouseClick</a> 或 <a href="MouseClickDrag.htm">MouseClickDrag</a> 命令 (仅对于传统的 <a href="SendMode.htm">SendEvent 模式</a>) 时, 用户的键盘和鼠标输入被忽略. 这样避免了用户的鼠标移动和点击扰乱模拟鼠标事件. 当鼠标命令结束时, 会重新启用输入 (如果之前没有使用 <em>BlockInput On</em> 阻塞的情况下).</p>
      <p><strong>SendAndMouse</strong>: 上面两种模式的组合.</p>
      <p><strong>Default</strong>: 同时关闭 <em>Send</em> 和 <em>Mouse</em> 模式, 但不改变输入阻塞的当前状态. 例如, 如果 <em>BlockInput On</em> 当前有效, 那么使用 <em>BlockInput Default</em> 不会关闭它.</p>
      <p><u><strong><a name="MouseMove"></a>模式 3</strong> (在 Windows 9x 上无效; 需要 v1.0.43.11+)</u>: 此模式的操作独立于其他两种. 例如, 如果 <em>BlockInput On</em> 和 <em>BlockInput MouseMove</em> 都有效时, 鼠标移动会被阻塞直到这两者被同时关闭.</p>
      <p><strong>MouseMove</strong>: 鼠标光标不会随用户对鼠标的物理移动而移动 (DirectInput 应用程序可能是个例外). 脚本中首次使用此命令时, 会安装 <a href="_InstallMouseHook.htm">鼠标钩子</a> (在还没有安装时). 同时, 脚本变得 <a href="_Persistent.htm">持续运行的</a>, 意味着应该使用 <a href="ExitApp.htm">ExitApp</a> 结束脚本. 鼠标钩子会一直保持加载状态, 直到下一次使用 <a href="Suspend.htm">Suspend</a> 或 <a href="Hotkey.htm">Hotkey</a> 命令, 此时如果没有任何热键或热字串需要那么它会被移除 (请参见 <a href="_Hotstring.htm">#Hotstring NoMouse</a>).</p>
      <p><strong>MouseMoveOff</strong>: 允许用户移动鼠标光标.</p></td>
  </tr>
</table>

<h3>备注</h3>
<p>比起 BlockInput, 优先考虑使用 <a href="SendMode.htm"><em>SendMode Input</em></a> 或 <a href="SendMode.htm"><em>SendMode Play</em></a> 通常会更好, 这样键击和鼠标点击会变得不可中断. 这是因为与 BlockInput 不同, 这些模式不会丢弃发送期间用户输入的内容; 作为替代, 这些键击被缓冲起来在之后发送. 不使用 BlockInput 也避免了下一段落所描述的需要解决的粘滞按键问题.</p>
<p>如果在用户按住按键时启用 BlockInput, 可能会导致这些键 "卡住". 通过等待这些按键释放后才启用 BlockInput 可以避免此问题, 与本例一样:</p>
<pre>^!p::
KeyWait Control  <em>; 等待按键释放.  为每个热键修饰符使用一次 KeyWait 命令.</em>
KeyWait Alt
BlockInput On
<em>; ... 发送键击和鼠标点击 ...</em>
BlockInput Off
return</pre>
<p>每当发送 ALT 事件时, 输入阻塞会自动和临时禁用 (之后重新启用).</p>
<p>下表显示了 BlockInput 在不同 Windows 版本上表现的多样性; 然而由于 Windows API 的特性, 在任何平台中按下 Ctrl+Alt+Del 都将重新启用输入.</p>
<table class="info">
  <tr>
    <th width="37%"><strong><em>操作系统</em></strong></th>
    <th width="63%"><strong><em>"BlockInput" 效果</em></strong></th>
  </tr>
  <tr>
    <td>Windows 95 </td>
    <td>无效.</td>
  </tr>
  <tr>
    <td>Windows 98/Me</td>
    <td>阻塞用户输入且 AutoHotkey <strong>不能</strong> 模拟输入.</td>
  </tr>
  <tr>
    <td>Windows NT 4 (<em>不含 </em> ServicePack 6)</td>
    <td>无效.</td>
  </tr>
  <tr>
    <td>Windows NT 4 (<em></em><em>含 </em> ServicePack 6)</td>
    <td>阻塞用户输入, 不过 AutoHotkey 可以模拟键击和鼠标点击.</td>
  </tr>
  <tr>
    <td>Windows 2000/XP</td>
    <td>阻塞用户输入, 不过 AutoHotkey 可以模拟键击和鼠标点击.</td>
  </tr>
</table>
<p><br>Windows 98/Me: 尽管在这些操作系统上执行 BlockInput 期间脚本不能发送键击和鼠标点击, 不过类似 <a href="WinMove.htm">WinMove</a> 这样的命令仍然有效. <a href="ControlSend.htm">ControlSend </a>可能也会起作用.</p>
<p><a href="_UseHook.htm">钩子热键</a> 的某些类型在 BlockInput 启用时仍然可以被触发. 例子包括 "MButton" (鼠标钩子) 和 "LWin &amp; Space" (含有除修饰符 "$#" 外的明确前缀的键盘钩子).</p>
<p>当脚本关闭时会自动重新启用输入.</p>
<h3>相关</h3>
<p><a href="SendMode.htm">SendMode</a>, <a href="Send.htm">Send</a>, <a href="Click.htm">Click</a>, <a href="MouseMove.htm">MouseMove</a>, <a href="MouseClick.htm">MouseClick</a>, <a href="MouseClickDrag.htm">MouseClickDrag</a></p>
<h3>示例</h3>
<pre class="NoIndent">if A_OSType &lt;&gt; WIN32_WINDOWS <em>; 即不是 Windows 9x.</em>
    BlockInput, on
Run, notepad
WinWaitActive, Untitled - Notepad
Send, {F5} <em>; 粘贴时间和日期</em>
BlockInput, off</pre>

</body>
</html>
